package cn.tedu.threadpool;

import java.util.concurrent.*;

public class ExecutorServiceDemo {

    public static void main(String[] args) {

        // int corePoolSize - 核心线程数量
        // int maximumPoolSize - 最大线程数量 = 核心线程数 + 临时线程数
        // long keepAliveTime - 临时线程用完之后的存活时间
        // TimeUnit unit - 时间单位
        // BlockingQueue<Runnable> workQueue - 工作队列
        // handler - 拒绝执行处理器 - 如果有明确的拒绝流程，那么可以添加这个参数
        ExecutorService es = new ThreadPoolExecutor(
                5, // 5个核心线程
                12, // 7个临时线程
                5, TimeUnit.SECONDS, // 临时线程用完之后存活5s
                new ArrayBlockingQueue<>(8),
                (r, e) -> {
                    // 实际过程中，考虑记录日志(时间，IP，内容)
                    System.out.println("拒绝执行" + r);
                }
        );

        // new Thread(new ESThread()).start();
        // 执行线程
        // 只能执行Runnable线程
        // es.execute(new ESThread());
        // 能够执行Runnable和Callable线程
        // es.submit(new ESThread());
        // 5个核心线程，工作队列容量为8，7个临时线程
        for (int i = 0; i < 22; i++) {
            es.submit(new ESThread());
        }
        // 关闭
        es.shutdown();
    }

}

class ESThread implements Runnable {
    @Override
    public void run() {
        try {
            System.out.println("start");
            Thread.sleep(3000);
            System.out.println("end");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
